package com.tjetc._2annotation;

import java.lang.annotation.*;
import java.util.Arrays;


public class _2AnnotationType {
    public static void main(String[] args) {
        /*
            这四个元注解所表示的含义
            1. Retention //指定注解的作⽤范围，三种 SOURCE,CLASS,RUNTIME
            2. Target //指定注解可以在哪些地⽅使⽤ TYPE METHOD FIELD
            3. Documented //指定该注解是否会在 javadoc 体现
            4. Inherited //⼦类会继承⽗类注解


            自定义注解（需要结合Java高级中的反射来实现框架底层）
         */
        System.out.println(Arrays.toString(G.class.getAnnotations()));
        System.out.println(Arrays.toString(H.class.getAnnotations()));
    }

    @A(name = "1", nums = {1, 2})
    void f(){

    }
}

@SuppressWarnings("all")
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Inherited // 注意：只能在类中使用 接口中没有继承
@Target({ElementType.METHOD, ElementType.TYPE})
@interface A {
    // 注解中的内容可以是类型 但是他是通过无参方法来进行表达
    // 这里的属性值 可以有默认值 如果没有默认值 必须赋值
    String name() default "";
    int[] nums() default {};
//    B test() ;
//    Class clazz();
    /*
        注解中不能放自定义类，接口，抽象类
     */
//    D d();
//    E e();
//    F f();
}

@SuppressWarnings("all")
enum B {
    A,
    C;
}

class D {

}

interface E {}

abstract class F{}


@A
class G {

}

class H extends G {

}
